package com.fowo.api.sys.cns;

import java.util.Arrays;

/**
 * 变更通知服务，用于对外通知数据变更
 * @author yl_ls
 */
public interface ChangeNoticeService {
    /**
     * 通知对象上有大更新，不指定更新了什么数据，处理方需要主动查询
     * @param objectName 对象名称
     */
    void noticeBatchUpdate(String objectName);

    /**
     * 通知对象上有大更新，指定更新内容
     * @param objectName 对象名称
     * @param insertKeys 新增的键列表
     * @param updateKeys 更新的键列表
     * @param removeKeys 删除的键列表
     */
    void noticeBatchUpdate(String objectName, Iterable<Long> insertKeys, Iterable<Long> updateKeys, Iterable<Long> removeKeys);

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param insertKeys 新增的键列表
     */
    void noticeInserts(String objectName, Iterable<Long> insertKeys);

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param insertKeys 新增的键列表
     */
    default void noticeInserts(String objectName, Long... insertKeys) {
        noticeInserts(objectName, Arrays.asList(insertKeys));
    }

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param updateKeys 更新的键列表
     */
    void noticeUpdates(String objectName, Iterable<Long> updateKeys);

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param updateKeys 更新的键列表
     */
    default void noticeUpdates(String objectName, Long...  updateKeys) {
        noticeUpdates(objectName, Arrays.asList(updateKeys));
    }

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param removeKeys 删除的键列表
     */
    void noticeRemoves(String objectName, Iterable<Long> removeKeys);

    /**
     * 通知对象上有数据更新
     * @param objectName 对象名称
     * @param removeKeys 删除的键列表
     */
    default void noticeRemoves(String objectName, Long...  removeKeys) {
        noticeRemoves(objectName, Arrays.asList(removeKeys));
    }
}
